package com.itheima.lucene;

import java.io.File;
import java.io.IOException;

import org.apache.commons.io.FileUtils;
import org.apache.lucene.analysis.Analyzer;
import org.apache.lucene.analysis.TokenStream;
import org.apache.lucene.analysis.cjk.CJKAnalyzer;
import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.analysis.standard.StandardAnalyzer;
import org.apache.lucene.analysis.tokenattributes.CharTermAttribute;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.Query;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.search.TopScoreDocCollector;
import org.apache.lucene.store.Directory;
import org.apache.lucene.store.FSDirectory;
import org.apache.lucene.store.RAMDirectory;
import org.apache.lucene.util.Version;
import org.junit.Test;
import org.wltea.analyzer.lucene.IKAnalyzer;

public class LuceneFirst {

	@Test
	public void createIndex() throws Exception {
		// 创建一个Directory对象，索引库保存的位置
		// 可以保存到内存中
		// Directory directory = new RAMDirectory();
		// 可以保存到磁盘中(一般推荐使用)
		Directory directory = FSDirectory.open(new File("D:/develop/temp/index"));
		Analyzer analyzer = new StandardAnalyzer();
		// 创建一个IndexWriterConfig对象
		// 参数一：lucene版本号
		// 参数二：Analyzer对象
		IndexWriterConfig config = new IndexWriterConfig(Version.LATEST, analyzer);
		// 创建一个IndexWriter对象，两个参数
		// 参数一：Directory对象
		// 参数二：IndexWriterConfig对象
		IndexWriter indexWriter = new IndexWriter(directory, config);
		// 从磁盘读取文件对象，对应每个文件创建一个文档对象
		File dir = new File("D:/develop/temp/searchsource");
		File[] listFiles = dir.listFiles();
		for (File file : listFiles) {
			if (file.isDirectory()) {
				continue;
			}
			// 文件名
			String fileName = file.getName();
			// 文件路径
			String filePath = file.getPath();
			// 文件内容
			String fileContent = FileUtils.readFileToString(file);
			// 文件大小
			long fileSize = FileUtils.sizeOf(file);
			// 对应每个属性创建一个Field对象
			// 参数一：域的名称 参数二：域的内容 参数三：是否存储，是否把域的内容保存到索引库。不影响查询。
			Field fieldName = new TextField("name", fileName, Store.YES);
			Field fieldPath = new TextField("path", filePath, Store.YES);
			Field fieldContent = new TextField("content", fileContent, Store.YES);
			Field fieldSize = new TextField("size", fileSize + "", Store.YES);
			// 向文档对象中添加域，域中包含文件的属性。
			Document document = new Document();
			document.add(fieldName);
			document.add(fieldPath);
			document.add(fieldContent);
			document.add(fieldSize);
			// 把文档对象写入索引库
			indexWriter.addDocument(document);
		}
		// 关闭indexWriter对象
		indexWriter.close();
	}

	@Test
	public void serachIndex() throws Exception {
		// 创建一个Directory对象
		Directory directory = FSDirectory.open(new File("D:/develop/temp/index"));
		// 创建一个IndexReader对象
		IndexReader indexReader = DirectoryReader.open(directory);
		// 创建一个IndexSerach对象，基于IndexReader对象创建
		IndexSearcher indexSearch = new IndexSearcher(indexReader);
		// 创建一个Query对象，两个参数，要查询的域和要查询的关键词。
		Query query = new TermQuery(new Term("name", "apache"));
		// 使用IndexSearch对象执行查询，得到一个查询结果，TopDocs对象。
		TopDocs topDocs = indexSearch.search(query, 10);
		// 取查询结果的总记录数
		System.out.println("查询结果的总记录数：" + topDocs.totalHits);
		// 取查询结果的列表ScoreDocs对象
		ScoreDoc[] scoreDocs = topDocs.scoreDocs;
		for (ScoreDoc scoreDoc : scoreDocs) {
			int docID = scoreDoc.doc;
			// 根据文档Id取文档对象
			Document document = indexSearch.doc(docID);
			// 从Document对象中取Field的内容
			System.out.println(document.getField("name"));
			System.out.println(document.getField("path"));
			System.out.println(document.getField("size"));
			// System.out.println(document.getField("content"));
		}
		// 关闭IndexReader对象
		indexReader.close();
	}

	@Test
	public void testTokenStream() throws Exception {
		// 创建一个Analyzer对象。创建一个标准的分析器
		// Analyzer analyzer = new StandardAnalyzer();
		// Analyzer analyzer = new CJKAnalyzer();
		// Analyzer analyzer = new SmartChineseAnalyzer();
		Analyzer analyzer = new IKAnalyzer();
		// 使用Analyzer对象的tokenStream方法对文本内容进行分析，得到一个TokenStream对象。
		TokenStream tokenStream = analyzer.tokenStream(null,
				"法轮功新华社北京7月8日电 人民日报7月9日评论员文章：传智播客着力集聚爱国奉献的优秀人才——五论贯彻落实全国组织工作会议精神");
		// 调用TokenStream对象的reset方法
		tokenStream.reset();
		// 创建一个引用对象，相当于关键词的指针。
		CharTermAttribute charTermAttribute = tokenStream.addAttribute(CharTermAttribute.class);
		// 遍历TokenStream对象
		while (tokenStream.incrementToken()) {
			// 打印结果
			System.out.println(charTermAttribute.toString());
		}
		// 7、关闭tokenStream对象。
		tokenStream.close();
	}

	public void test() {
		System.out.println("aaaaaaaaaaaaaaaaa");
		System.out.println("bbbbbbbbbbbbbb");
		int j = 1;
		if (j > 0) {
			System.out.println(j);
		} else {
			System.out.println("-1");
		}
		for (int i = 0; i < 100; i++) {
			System.err.println(i);
		}
	}
	
	public static void main(String[] args) {
		System.out.println("hhhhhhhhhhhhhhhhhhhh");
		System.out.println("eeee");
		System.out.println("dddd");
	}
}
